/* CoralCube | Massively Multiplayer Online Role-Playing Game(MMORPG) Emulator.
|* 
|* Copyright (C) 2008-2010 TrinityCore <http://www.trinitycore.org/>
|*               2008-2010 CoralCube <http://www.CoralCube.com/>
|*
|* This program is free software. You can redistribute it and/or modify it under the terms of 
|* the GNU General Public License as published by the Free Software Foundation, either 
|* version 2 of the License.
|*
|* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY, 
|* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
|* See the GNU General Public License for more details.
|*
|* You should have received a copy of the GNU General Public License along with this program. 
|* If not, see <http://www.gnu.org/licenses/>.
|*/

#ifndef _RCSOAP_H
#define _RCSOAP_H

#include "Common.h"
#include "World.h"
#include "AccountMgr.h"
#include "Log.h"

#include "soapH.h"
#include "soapStub.h"
#include "stdsoap2.h"

#include <ace/Semaphore.h>
#include <ace/Task.h>

class RCSoapRunnable: public ACE_Based::Runnable
{
public:
    RCSoapRunnable() { }
    void run();
    void setListenArguments(std::string host, uint16 port)
    {
        m_host = host;
        m_port = port;
    }
private:
    std::string m_host;
    uint16 m_port;
};

class SOAPWorkingThread : public ACE_Task<ACE_MT_SYNCH>
{
public:
    SOAPWorkingThread() { }

    virtual int svc(void)
    {
        while(1)
        {
            ACE_Message_Block *mb = 0;
            if (this->getq(mb) == -1)
            {
                ACE_DEBUG((LM_INFO,
                    ACE_TEXT("(%t) Shutting down\n")));
                break;
            }

            // Process the message.
            process_message(mb);
        }

        return 0;
    }
private:
    void process_message(ACE_Message_Block *mb);
};

class SOAPCommand
{
public:
    SOAPCommand() : pendingCommands(0, USYNC_THREAD, "pendingCommands") { }

    ~SOAPCommand() { }

    void appendToPrintBuffer(const char* msg)
    {
        m_printBuffer += msg;
    }

    ACE_Semaphore pendingCommands;

    void setCommandSuccess(bool val)
    {
        m_success = val;
    }

    bool hasCommandSucceeded()
    {
        return m_success;
    }

    static void print(void* callbackArg, const char* msg)
    {
        ((SOAPCommand*)callbackArg)->appendToPrintBuffer(msg);
    }

    static void commandFinished(void* callbackArg, bool success);

    bool m_success;
    std::string m_printBuffer;
};

#endif
